iT邦幫忙

2025 iThome 鐵人賽

DAY 3
0
Rust

DataFusion 闖關攻略:30 天學習 Rust 查詢引擎之旅系列 第 3

Day 03 - DataFusion 初體驗: 建立第一個查詢

  • 分享至 

  • xImage
  •  

前言

經過前兩天的介紹,相信大家對 Apache DataFusion 已經有了基本認識。今天我們要進入快樂的實作階段,嘗試建立一個 rust 小專案並透過 DataFusion 查詢不同格式的資料。

環境建立

Rust 安裝

目前 DataFusion 最新的穩定版本 49.0.2 要求 Rust 1.85.1 或更新版本::

# 安裝 Rust(所有平台通用)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.bashrc  # Linux/macOS

# 驗證安裝
rustc --version  # 應顯示 1.85.1+

Windows 使用者請下載 rustup-init.exe 安裝。

建立專案

透過 cargo 建立專案 datafusion-demo,進入該專案後新增存放資料用的目錄 data

cargo new datafusion-demo
cd datafusion-demo
mkdir data

什麼是 Cargo?
Cargo 是 Rust 的專案管理工具,類似於 Python 的 pip 或 Node.js 的 npm。它會幫我們管理相依套件、編譯程式碼等工作。

Cargo.toml 中設定專案的基本資訊和本次實作需要的相依套件:

[package]
name = "datafusion-demo"
version = "0.1.0"
edition = "2024"

[dependencies]
datafusion = "50.0.0"
tokio = { version = "1.0", features = ["rt-multi-thread", "macros"] }

準備數據

data 中新增學生成績資料的 csv 檔案。

(data/students.csv):

name,age,subject,score,semester
張小明,20,數學,85,2024春
李小華,21,數學,92,2024春
王小美,19,英文,78,2024春
陳小強,22,英文,88,2024春
張小明,20,英文,82,2024春
李小華,21,物理,90,2024春
王小美,19,數學,75,2024春
陳小強,22,數學,95,2024春

實作查詢學生成績的程式

我們將程式分成幾個部分解釋。

1. 基本設定

src/main.rs中改寫 main function

use datafusion::prelude::*;

#[tokio::main]
async fn main() -> datafusion::error::Result<()> {

    // 建立 SessionContext
    let ctx = SessionContext::new();
    
    // 依序加入2-3 的程式碼    
    Ok(())
}

其中:

  • #[tokio::main] 讓我們可以使用 async/await 非同步的方式進行後面 I/O 的操作
  • SessionContext::new() 建立查詢環境,類似資料庫連線

2. 註冊數據源

使用先前創建的 SessionContext 註冊 csv 檔案

// 註冊 CSV 檔案 - 並命名為 "students_csv"
ctx.register_csv("students_csv", "data/students.csv", CsvReadOptions::new()).await?;

其中:

  • register_xxx() 將 CSV/JSON 檔案註冊為可查詢的表格,註冊後就可以用 SQL 語法查詢,就像查詢資料庫表格一樣
  • .await? 表示等待操作完成,如果有錯誤就停止程式

3. 查詢 CSV 檔案

註冊完成後,便可以透過 SQL 語法查詢該 csv 檔了,這次我們來計算這些學生的平均成績吧~

println!("\n📊 CSV 格式查詢:每位學生平均分數");
let csv_query = ctx.sql("
    SELECT name, AVG(score) as avg_score
    FROM students_csv
    GROUP BY name
    ORDER BY avg_score DESC
").await?;
csv_query.show().await?;

其中:

  • ctx.sql() 創建一個執行 query 計畫
  • 這個查詢計算每個學生的平均分數
    • GROUP BY name 按姓名分組
    • ORDER BY avg_score DESC 按平均分數降序排列
  • .show() 執行查詢並顯示查詢結果

到這邊程式已經大功告成啦! 最後我們只需要執行程式:

cargo run

成功後就可以看到查詢的結果了

+--------+-----------+
| name   | avg_score |
+--------+-----------+
| 陳小強 | 91.5      |
| 李小華 | 91.0      |
| 張小明 | 83.5      |
| 王小美 | 76.5      |
+--------+-----------+

從上面的實作中可以發現我們只要透過 DataFusion 註冊數據來源 (csv 檔) 後,便可以使用 SQL 語法輕鬆的查詢或計算這些檔案的資訊,查詢引擎是不是很方便呀~

明天我們將繼續探討 SessionContext 的內部機制並認識 DataFusion 提供的兩大類型 API,敬請期待!

參考資料


上一篇
Day 02 - DataFusion 記憶體格式介紹 - Apache Arrow
系列文
DataFusion 闖關攻略:30 天學習 Rust 查詢引擎之旅3
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言